import { useState, useEffect, useCallback } from 'react';
import { getCurrentUser, logout as logoutApi, clearUserData } from '../services/auth';
import { Message } from '@arco-design/web-react';

/**
 * 用户信息接口
 * 定义用户基本信息的数据结构
 * 
 * @interface UserInfo
 * @author ltx
 * @since 2025-01-27 14:43:42
 */
interface UserInfo {
  /** 用户ID - 用户的唯一标识符 */
  id: number;
  /** 用户名 - 用户登录使用的用户名 */
  username: string;
  /** 真实姓名 - 用户的真实姓名，可选字段 */
  realName?: string;
  /** 邮箱 - 用户的邮箱地址，可选字段 */
  email?: string;
  /** 头像URL - 用户头像的URL地址，可选字段 */
  avatar?: string;
  /** 手机号 - 用户的手机号码，可选字段 */
  phone?: string;
}

/**
 * 用户认证Hook返回值接口
 * 定义useAuth Hook返回的数据结构和方法
 * 
 * @interface UseAuthReturn
 * @author ltx
 * @since 2025-01-27 14:43:42
 */
interface UseAuthReturn {
  /** 当前用户信息 - 当前登录用户的详细信息，未登录时为null */
  user: UserInfo | null;
  /** 是否已登录 - 标识用户当前的登录状态 */
  isLoggedIn: boolean;
  /** 是否正在加载 - 标识是否正在进行用户信息获取等异步操作 */
  loading: boolean;
  /** 刷新用户信息 - 从服务器重新获取用户信息的方法 */
  refreshUser: () => Promise<void>;
  /** 退出登录 - 执行用户退出登录操作的方法 */
  logout: () => Promise<void>;
  /** 处理token过期 - 当token过期时清理用户状态并跳转到登录页 */
  handleTokenExpired: () => void;
}

/**
 * 用户认证Hook
 * 管理用户登录状态、获取用户信息、退出登录功能
 * 提供完整的用户认证相关状态管理和操作方法
 * 
 * @returns {UseAuthReturn} 用户认证相关状态和方法
 * @throws {Error} 当用户信息获取或退出登录操作失败时抛出错误
 * @author ltx
 * @since 2025-01-27 14:43:42
 */
export const useAuth = (): UseAuthReturn => {
  // 用户信息状态 - 存储当前登录用户的信息
  const [user, setUser] = useState<UserInfo | null>(null);
  // 加载状态 - 标识是否正在进行异步操作
  const [loading, setLoading] = useState<boolean>(true);

  /**
   * 刷新用户信息
   * 从服务器获取最新的用户信息并更新本地状态
   * 处理认证失败的情况，自动清理本地存储
   * 
   * @returns {Promise<void>} 无返回值的Promise，操作完成后resolve
   * @throws {Error} 当获取用户信息失败时抛出错误
   * @author ltx
   * @since 2025-01-27 14:43:42
   */
  const refreshUser = useCallback(async (): Promise<void> => {
    try {
      setLoading(true);
      console.log('开始获取用户信息...');
      
      const userInfo = await getCurrentUser();
      if (userInfo) {
        setUser(userInfo);
        console.log('用户信息获取成功:', userInfo);
      } else {
        setUser(null);
        console.log('用户未登录');
      }
    } catch (error) {
      console.error('获取用户信息失败:', error);
      setUser(null);
      // 如果是认证错误，清除本地存储
      if (error instanceof Error && (error.message.includes('401') || error.message.includes('Token已过期'))) {
        try {
          clearUserData();
          console.log('已清除本地认证数据');
        } catch (clearError) {
          console.error('清除本地数据失败:', clearError);
        }
      }
    } finally {
      setLoading(false);
    }
  }, []);

  /**
   * 处理token过期
   * 当token过期时清理用户状态并跳转到登录页
   */
  const handleTokenExpired = useCallback((): void => {
    console.log('Token已过期，清理用户状态并跳转到登录页');
    
    // 清除用户状态
    setUser(null);
    
    // 清除本地存储
    clearUserData();
    
    // 显示提示信息
    Message.error('登录已过期，请重新登录');
    
    // 跳转到登录页面
    setTimeout(() => {
      window.location.href = '/login';
    }, 1500);
  }, []);

  /**
   * 退出登录
   * 执行完整的退出登录流程：立即清除本地状态、调用后端API、清理本地存储
   * 确保用户数据完全清理，防止数据泄露，优先保证UI立即响应状态变化
   * 
   * @returns {Promise<void>} 无返回值的Promise，操作完成后resolve
   * @author ltx
   * @since 2025-01-27 16:00:00
   */
  const logout = useCallback(async (): Promise<void> => {
    console.log('🚀 开始退出登录流程...');
    
    // 第一步：立即清除用户状态 - 确保UI立即响应，显示登录按钮
    console.log('📝 立即清除用户状态...');
    setUser(null);
    console.log('✅ 用户状态已清除，UI应该立即显示登录按钮');
    
    // 第二步：立即清除本地存储 - 确保本地数据安全
    console.log('🗑️ 开始清除本地存储数据...');
    try {
      // 手动清除关键数据，确保立即生效
      localStorage.removeItem('userInfo');
      localStorage.removeItem('token');
      console.log('✅ 手动清除localStorage关键数据完成');
      
      // 调用clearUserData清除Cookie等其他数据
      clearUserData();
      console.log('✅ clearUserData执行完成，Cookie已清除');
    } catch (clearError) {
      console.error('❌ 清除本地存储失败:', clearError);
      // 即使clearUserData失败，关键的localStorage数据已经清除
    }
    
    // 第三步：调用后端退出登录API - 通知服务器用户退出登录
    console.log('🌐 调用后端退出登录API...');
    try {
      await logoutApi();
      console.log('✅ 后端退出登录API调用成功');
      Message.success('退出登录成功');
    } catch (apiError) {
      console.error('❌ 后端退出登录API调用失败:', apiError);
      // API失败不影响本地状态，用户已经在UI上看到退出效果
      Message.warning('退出登录成功，但服务器通知失败');
    }
    
    console.log('🎉 退出登录流程完成');
    
    // 强制触发状态更新，确保组件重新渲染
    setTimeout(() => {
      console.log('🔄 强制检查状态更新...');
      console.log('当前用户状态:', user);
      console.log('当前登录状态:', !!user);
    }, 100);
  }, [user]);

  /**
   * 组件挂载时获取用户信息
   * 检查本地存储中的token，如果存在则尝试获取用户信息
   */
  useEffect(() => {
    console.log('useAuth Hook初始化...');
    
    // 检查localStorage中是否有token或userInfo
    const token = localStorage.getItem('token');
    const userInfo = localStorage.getItem('userInfo');
    
    console.log('localStorage中的token:', !!token);
    console.log('localStorage中的userInfo:', userInfo);
    
    if (token || userInfo) {
      console.log('发现token或userInfo，开始刷新用户信息...');
      refreshUser();
    } else {
      console.log('没有找到token或userInfo，设置loading为false');
      setLoading(false);
    }
  }, [refreshUser]);

  return {
    user,
    isLoggedIn: !!user,
    loading,
    refreshUser,
    logout,
    handleTokenExpired
  };
};

export default useAuth;